#ifndef TABOOSTATE_H_
#define TABOOSTATE_H_

#include "tabooList.h"

/**rappresenta una struttura contenente una serie di TabooList. Si e' scelto di creare questa
 * struttura (anziche' utilizzare un banale array) per conformarsi alle precedenti strutture che utilizzano
 * K e N: dato che questa struttura e' grande K elementi, tale K e' accessibile utilizzando il campo ononimo
 * nella struttura dati.
 *
 */
typedef struct TabooState {
	/**indica un array di tabooList di lunghezza K*/
	PtabooList* tls;
	/**indica una cella di memoria in cui e' indicato il numero di camion presenti nel problema*/
	int* K;
} TabooState;

typedef TabooState* PtabooState;

/**costruisce una serie di tabooLists
 *
 * @param N indica un puntatore ad una cella in memoria in cui e' presente il nuemro di nodi del grafo
 * @param K indica un puntatore ad una cella in memoria in cui e' presente il numero di camion del grafo
 * @param initTime indica il nuemro di iterazioni globale da inserire in ogni tabu. Per una taboo puliuta inserire il valore 0.
 * @return un puntatore ad una lista di tabooLists.
 */
PtabooState initTabooState(int* N, int* K, TabooExpire initTime);

/**elimina dalla memoria tutte le tabooList contenute in memoria. Non vengono tuttavia eliminati gli EdgeID utilizzati
 *
 * \pre
 *  \li pts non NULL
 * \post
 *  \li pts viene liberata completamente
 *  \li la cella puntata da K <b>non</b> viene alterata
 *
 * @param tbl la lista di tabooList da eliminare
 */
void freeTabooState(PtabooState pts);

/**
 * @param p_tabooState un riferimento allo stato taboo del problema
 * @param k il camion di cui reperire il percorso
 * @return la taboo list del camion k
 */
PtabooList getTabooListInTabooState(PtabooState p_tabooState, int k);

/** stampa una serie di taboo lists
 *
 * @param f il file su cui stampare la rappresentazione grafica delle taboo lists
 * @param tbl le taboo lists da stampare
 * @param now indica il numero di iterazioni globali a cui l'algoritmo e' arrivato
 */
void printTabooState(FILE* f, PtabooState pts, TabooExpire now);

/** stampa una serie di taboo lists nel formato Set (cfr printTabooListAsSet)
 *
 * @param f il file su cui stampare la rappresentazione grafica delle taboo lists
 * @param tbl le taboo lists da stampare
 * @param now indica il numero di iterazioni globali a cui l'algoritmo e' arrivato
 */
void printTabooStateAsSet(FILE* f, PtabooState pts, TabooExpire now);

/**imposto ogni taboo contenuto in questo stato di taboo al valore specificato.
 * NON USARE!
 *
 * \pre
 *  \li pts non NULL
 * \post
 *  \li all'interno di ogni taboolist presente in pts compare come TabooExpire il valore resetvalue
 *
 * @param pts la taboo da modificare
 * @param resetvalue il valore da sostituire a qualunque altro valore contenuto nella taboo
 */
void resetTabooState(PtabooState pts,TabooExpire resetvalue);

#endif /* TABOO_H_ */
